home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / crayola / common / crayBezier.c < prev    next >
C/C++ Source or Header  |  1993-01-15  |  5KB  |  192 lines

  1. #include "ooglutil.h"
  2. #include "point3.h"
  3. #include "hpoint3.h"
  4. #include "geom.h"
  5. #include "bezierP.h"
  6. #include "crayolaP.h"
  7.  
  8. #ifndef FUDGE
  9. #define FUDGE .1
  10. #endif
  11.  
  12. void *cray_bezier_HasVColor(int sel, Geom *geom, va_list args);
  13. void *cray_bezier_UseVColor(int sel, Geom *geom, va_list args);
  14. void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list args);
  15. void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list args);
  16. void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list args);
  17. void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list args);
  18. void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list args);
  19.  
  20. #define MAX_METHODS 10
  21.  
  22. static craySpecFunc methods[] = {
  23.   "crayHasColor", cray_bezier_HasVColor,
  24.   "crayHasVColor", cray_bezier_HasVColor,
  25.   "crayCanUseVColor", crayTrue,
  26.   "crayUseVColor", cray_bezier_UseVColor,
  27.   "crayEliminateColor", cray_bezier_EliminateColor,
  28.   "craySetColorAll", cray_bezier_SetColorAll,
  29.   "craySetColorAt", cray_bezier_SetColorAt,
  30.   "craySetColorAtF", cray_bezier_SetColorAtF,
  31.   "crayGetColorAt", cray_bezier_GetColorAt,
  32.   "crayGetColorAtV", cray_bezier_GetColorAt
  33.   };
  34.  
  35. cray_bezier_init() {
  36.   crayInitSpec(methods, MAX_METHODS, GeomClassLookup("bezier"));
  37.   return 0;
  38. }
  39.  
  40. void *cray_bezier_HasVColor(int sel, Geom *geom, va_list args) {
  41.   Bezier *b = (Bezier *)geom;
  42.   return (void *)(b->flag & BEZ_C);
  43. }
  44.  
  45. void *cray_bezier_UseVColor(int sel, Geom *geom, va_list args) {
  46.   int i;
  47.   Bezier *b = (Bezier *)geom;
  48.   ColorA *def;
  49.  
  50.   if (crayHasColor(geom, NULL)) return 0;
  51.  
  52.   def = va_arg(args, ColorA *);
  53.   for (i = 0; i < 4; i++) b->c[i] = *def; 
  54.  
  55.   b->flag |= BEZ_C;
  56.  
  57.   return (void *)geom;
  58. }
  59.  
  60. void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list args) {
  61.   Bezier *b = (Bezier *)geom;
  62.  
  63.   if (!crayHasColor(geom, NULL)) return NULL;
  64.   b->flag ^= BEZ_C;
  65.   return (void *)geom;
  66. }
  67.  
  68. void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list args) {
  69.   int i;
  70.   Bezier *b = (Bezier *)geom;
  71.   ColorA *color;
  72.  
  73.   if (!crayHasColor(geom, NULL)) return NULL;
  74.   color = va_arg(args, ColorA *);
  75.   for (i = 0; i < 4; i++) b->c[i] = *color;
  76.   return (void *)geom;
  77. }
  78.  
  79. #define prtpt3(pt) fprintf(stderr, "%.3f %.3f %.3f\n", \
  80.                ((Point3 *)(pt))->x, ((Point3 *)(pt))->y, \
  81.                ((Point3 *)(pt))->z)
  82. #define prtpt4(pt) fprintf(stderr, "%.3f %.3f %.3f %.3f\n", \
  83.                ((HPoint3 *)(pt))->x, ((HPoint3 *)(pt))->y, \
  84.                ((HPoint3 *)(pt))->z, ((HPoint3 *)(pt))->w)
  85.  
  86. static int WhichCorner(Bezier *b, int vindex, HPoint3 *pt) {
  87.   float close, newclose;
  88.   const Point3 *pt3;
  89.   HPoint3 *pt4;
  90.   int index;
  91.  
  92.   pt3 = (Point3 *)pt;
  93.   pt4 = pt;
  94.  
  95.   if (b->dimn != 3 && b->dimn != 4) {
  96.     OOGLError(1, "Bezier patch of unrecognized dimension %d.\n", b->dimn);
  97.     return -1;
  98.   }
  99.   /* Hits on a corner of the mesh are vertex hits.  Other hits are face 
  100.    * hits and color the entire thing */
  101.   close = FUDGE;
  102.   index = -1;
  103.   newclose = b->dimn == 3 ? 
  104.     Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[0])) :
  105.       HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[0]));
  106.   if (newclose < close) {
  107.     index = 0;
  108.     close = newclose;
  109.   }
  110.   newclose = b->dimn == 3 ?
  111.     Pt3Distance(pt3, (Point3 *)(&b->CtrlPnts[b->degree_u * 3])) :
  112.       HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[b->degree_u * 4]));
  113.   if (newclose < close) {
  114.     index = 1;
  115.     close = newclose;
  116.   }
  117.   newclose = b->dimn == 3 ?
  118.     Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) *
  119.                             b->degree_u) * 3])) 
  120.       : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) *
  121.                             b->degree_u) * 4]));
  122.   
  123.   if (newclose < close) {
  124.     index = 2;
  125.     close = newclose;
  126.   }
  127.   newclose = b->dimn == 3 ? 
  128.     Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) *
  129.                             (b->degree_u + 1) - 1)
  130.                            * 3]))
  131.       : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) *
  132.                             (b->degree_u + 1) - 1) 
  133.                            * 4]));
  134.   if (newclose < close) {
  135.     index = 3;
  136.     newclose = close;
  137.   }
  138.  
  139.   return index;
  140. }
  141.  
  142. void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list args) {
  143.   Bezier *b = (Bezier *)geom;
  144.   ColorA *color;
  145.   int vindex, index;
  146.   HPoint3 *pt;
  147.  
  148.   color = va_arg(args, ColorA *);
  149.   vindex = va_arg(args, int);
  150.   va_arg(args, int);            /* findex */
  151.   va_arg(args, int *);            /* edge */
  152.   va_arg(args, int *);            /* gpath */
  153.   pt = va_arg(args, HPoint3 *);
  154.  
  155.   index = WhichCorner(b, vindex, pt);
  156.   if (index < 0) return (void *)craySetColorAtF(geom, color, 0, NULL);
  157.  
  158.   b->c[index] = *color;
  159.   return (void *)geom;
  160. }
  161.  
  162. void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list args) {
  163.   int i;
  164.   Bezier *b = (Bezier *)geom;
  165.   ColorA *color;
  166.   if (!crayHasColor(geom, NULL)) return NULL;
  167.   color = va_arg(args, ColorA *);
  168.   for (i = 0; i < 4; i++) b->c[i] = *color;
  169.   return (void *)geom;
  170. }
  171.  
  172. void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list args) {
  173.   Bezier *b = (Bezier *)geom;
  174.   ColorA *color;
  175.   int vindex, index;
  176.   HPoint3 *pt;
  177.  
  178.   if (!crayHasColor(geom, NULL)) return NULL;
  179.   color = va_arg(args, ColorA *);
  180.   vindex = va_arg(args, int);
  181.   va_arg(args, int);                    /* findex */
  182.   va_arg(args, int *);                  /* edge */
  183.   va_arg(args, int *);                  /* gpath */
  184.   pt = va_arg(args, HPoint3 *);
  185.  
  186.   index = WhichCorner(b, vindex, pt);
  187.   if (index < 0) index = 0;
  188.  
  189.   *color = b->c[index];
  190.   return (void *)geom;
  191. }
  192.